package Email;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.*;
import java.nio.file.Paths;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Multipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
public class emailSender {
public static final HashMap<Integer, ArrayList<MessageToSend>> messagesToSend = new HashMap<>();
//maps the priority levels to the corresponding emails to be sent - within each priority level
public static Session objSession;
private static final String strEmail = "cz3003timecrisis@gmail.com";
private static final String strPwd = "3003liuyang";
private static final int intMaxPriority = 3;
static {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
objSession = Session.getInstance(props,
new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strEmail, strPwd);
}
});
for (int i = 1; i <= intMaxPriority; i++) {
messagesToSend.put(i, new ArrayList<>());
}
}
public static void getEmailsToBeSent(JSONArray jsonArrayOfMails) throws IOException, ParseException {
for (Object jsonArrayOfMail : jsonArrayOfMails) {
JSONObject jsonObject = (JSONObject) jsonArrayOfMail;
String from = jsonObject.get("from").toString();
String recipients = jsonObject.get("recipients").toString();
String subject = jsonObject.get("subject").toString();
String messageText = jsonObject.get("messageText").toString();
int priority = Integer.parseInt(jsonObject.get("priority").toString());
MessageToSend m = new MessageToSend(from, recipients, subject, messageText, priority);
messagesToSend.get(priority).add(m);
}
// System.out.println(messagesToSend);
}
public synchronized static void dispatchEmail() {
for (Integer intKey : messagesToSend.keySet()) {
for (int j = 0; j < messagesToSend.get(intKey).size(); j++) {
MessageToSend m = messagesToSend.get(intKey).get(j);
String from = m.from;
String recipients = m.recipients;
String subject = m.subject;
String messageText = m.messageText;
int priority = m.priority;
try {
sendEmail(from, recipients, subject, messageText, priority);
messagesToSend.get(intKey).remove(j);
} catch (MessagingException ex) {
}
}
}
}
public static void sendEmail(String from, String recipients, String subject, String messageText, int priority) throws MessagingException {
Message message = new MimeMessage(objSession);
message.setFrom(new InternetAddress(from));
//Need to test the line below for multiple recipients:
//InternetAddress[] toAddresses={new InternetAddress(strRecipient)};
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipients));
message.setSubject(subject);
message.setText(messageText);
if (messageText.endsWith(".pdf")) {
MimeBodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
messageBodyPart = new MimeBodyPart();
String file = "path of file to be attached";
String fileName = "report.pdf";
DataSource source = new FileDataSource(messageText);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
}
Transport.send(message);
}
}